#ifndef CONVER_TOOL_H
#define CONVER_TOOL_H

#include "stdint.h"

// 定义字节序模式
typedef enum {
    ENDIAN_LITTLE = 0,  // 小端模式：低地址存低字节（如0x12,0x34 → 0x3412）
    ENDIAN_BIG      // 大端模式：低地址存高字节（如0x12,0x34 → 0x1234）
} EndianMode;




/********************************************************************************************
*函数功能:CRC16计算
*参数:  
*返回值:
********************************************************************************************/
uint16_t crc_ccitt(uint8_t *q, uint16_t len);


/********************************************************************************************
*函数功能:判断value是否在范围内，双闭区间
*参数:  
*返回值:
********************************************************************************************/
int isInRange(int value, int min, int max);


/*********************************************************************************************
 * 将一个u32分解为4个u8
 * @param value - 待分解的u32值
 * @param bytes - 存储分解结果的数组(至少4字节)
 * @param big_endian - 是否使用大端序(高字节在前)
 ********************************************************************************************/

void u32_to_u8_array(uint32_t value, uint8_t bytes[4], EndianMode big_endian);

/*********************************************************************************************
 * 将两个u8合并为一个u16
 * @param high - 高8位字节
 * @param low - 低8位字节
 * @return 合并后的u16值
 ********************************************************************************************/
uint16_t u8_to_u16(uint8_t high, uint8_t low);


/********************************************************************************************
*函数功能:将U8数据拼接为 U16的数组 
*参数:  u8_buff: 		U8数组  
		u8_len:			U8数组长度，最长为16
		u16_buff:		U16数组 需要数组长度为4
		endian： 	0 = 小端， 1 = 大端
*返回值:
********************************************************************************************/
uint16_t u8_to_u16_array(uint16_t *u16_buff, const uint8_t *u8_buff,
							uint16_t u8_len, EndianMode endian) ;



/********************************************************************************************
*函数功能:将U16数据拆为 U8的数组 
*参数:  src： 		U16数组  
		src_len：	U16数组长度，最长为16
		dest：		U8数组 需要数组长度为4
		endian： 	0 = 小端， 1 = 大端
*返回值:
********************************************************************************************/
uint32_t u16_to_u8_array(uint8_t *u8_buff, const uint16_t *u16_buff, uint32_t u16_len,  EndianMode endian);

/********************************************************************************************
*函数功能:将U8数据拼接为 4个U32的数组 
*参数:  src： 		U8数组  
		src_len：	U8数组长度，最长为16
		dest：		U32数组 需要数组长度为4
		endian： 	0 = 小端， 1 = 大端
*返回值:
********************************************************************************************/
void u8_to_u32_array(const uint8_t *src, uint32_t src_len, 
					 uint32_t *dest, EndianMode endian, uint8_t pad_value);

/********************************************************************************************
*函数功能:uint16 交换高低字节
*参数:    
*返回值:
********************************************************************************************/
uint16_t swap16(uint16_t val);


/********************************************************************************************
*函数功能:uint32 交换高低字节
*参数:    
*返回值:
********************************************************************************************/
uint32_t swap32(uint32_t val);

/********************************************************************************************
*函数功能:求绝对值
*参数:    
*返回值:
********************************************************************************************/
int64_t abs64(int64_t val);

/********************************************************************************************
*函数功能:求浮点数的绝对值
*参数:    
*返回值:
********************************************************************************************/
float abs_float(float val);



/********************************************************************************************
*函数功能:求最大值最小值的绝对值的差-整型
*参数:    
*返回值:
********************************************************************************************/
double get_relative_error(double max, double min);



/********************************************************************************************
*函数功能:16进制数据格式化成字符串
*参数:    
*返回值:
********************************************************************************************/
void hex_to_string(char *string, char *hex, uint32_t num);


/********************************************************************************************
*函数功能:颠倒字节序
*参数:    
*返回值:
********************************************************************************************/
void byte_seq_reverse(uint8_t *buf, uint32_t len);


/********************************************************************************************
*函数功能:modbus-RTU crc校验
*参数:    
*返回值:
********************************************************************************************/
uint16_t modbus_crc16(uint8_t *Bufdata, uint16_t Buflen);

/********************************************************************************************
*函数功能:将字符串格式化成16进制字符串,注意此函数非进程安全，在加锁的条件下使用
*参数:    
*返回值:
********************************************************************************************/
char *hexToString(uint8_t *buf, uint16_t len);


/********************************************************************************************
*函数功能:温度格式化显示
*参数:    
*返回值: 
********************************************************************************************/
char *bsp_batTemp_format(int16_t temp);



/********************************************************************************************
*函数功能:将指定bit位设置成指定的值
*参数:    var:要修改的值
		index:bit位索引，0-15
		val:要设置成的值，0或者1
*返回值: 
********************************************************************************************/
void uint16BitSet(uint16_t *var, uint8_t index, uint8_t val);


/********************************************************************************************
*函数功能:将系统tick转换成时分秒
*参数:    
*返回值:
********************************************************************************************/
void tickToTime(uint32_t tick, uint16_t *hour, uint16_t *min, uint16_t *sec, uint16_t *ms);






/********************************************************************************************
*函数功能:计算世纪秒
*参数:    
*返回值:
********************************************************************************************/
uint64_t datetime_to_timestamp(uint16_t year, uint8_t month, uint8_t day, 
								uint8_t hour, uint8_t minute, uint8_t second); 











#endif
